﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Autoverwaltung.TUI
{
    public class AutoVerwaltung : Ansicht
    {
        public AutoVerwaltung(IAnsichtManager manager)
            : base(manager) { }

        public override void ZeigeUeberschrift()
        {
            Console.WriteLine("Autos verwalten");
            Console.WriteLine("------------------------------");
        }

        public override void ZeigeMenue()
        {
            Console.WriteLine("\nAnzeigen (a)");
            Console.WriteLine("Anzeigen nach Hersteller (b)");
            Console.WriteLine("Anzeigen nach Modell (c)");
            Console.WriteLine("Neu (d)");
            Console.WriteLine("Bearbeiten (e)");
            Console.WriteLine("Loeschen (l)");
            Console.WriteLine("------------------");
            Console.WriteLine("Zum Hauptmenue (z)");

            var key = this.Manager.EinfacheTastenEingabe();
            this.Manager.ConsoleLeeren();
            switch (key)
            {
                case ConsoleKey.A:
                    this.ZeigeAutos();
                    break;

                case ConsoleKey.B:
                    this.ZeigeAutosNachHersteller();
                    break;

                case ConsoleKey.C:
                    this.ZeigeAutosNachModell();
                    break;

                case ConsoleKey.D:
                    this.NeuesAuto();
                    break;

                case ConsoleKey.E:
                    this.BearbeiteAuto();
                    break;

                case ConsoleKey.L:
                    this.LoescheAuto();
                    break;

                case ConsoleKey.Z:
                    this.Manager.WechselAnsicht(Ansichten.Hauptmenue);
                    break;
            }
            Console.WriteLine("\n--------------------------------------------\n\n");
            this.ZeigeMenue();
        }

        private void ZeigeAutos()
        {
            Model.Auto[] autos = this.Manager.Fachkonzept.GibAutos();

            Console.WriteLine("Auflistung aller Autos:");
            Console.WriteLine("--------------------------------------------");
            if (autos != null && autos.Length > 0)
            {
                foreach (Model.Auto h in autos)
                {
                    this.ZeigeAuto(h);
                }
            }
            else
            {
                Console.WriteLine("Es wurden keine Autos gefunden.");
            }
        }

        private void ZeigeAutosNachModell()
        {
          this.ZeigeModelle();

          Model.Modell modell = null;
          do
          {
            int modellId = (int)this.Manager.ZahlenEingabe("Geben Sie bitte die Id eins Modells ein:");
            modell = this.Manager.Fachkonzept.GibModell(modellId);

          } while (modell == null);

          Model.Auto[] autos = this.Manager.Fachkonzept.GibAutosNach(modell);

          Console.WriteLine("Auflistung aller Autos mit Modell-ID: " + modell.Id + " (" + modell.Bezeichnung + "):");
          Console.WriteLine("--------------------------------------------");
          if (autos != null && autos.Length > 0)
          {
            foreach (Model.Auto h in autos)
            {
              this.ZeigeAuto(h);
            }
          }
          else
          {
            Console.WriteLine("Es wurden keine Autos gefunden.");
          }
        }

        private void ZeigeAutosNachHersteller()
        {
          this.ZeigeHersteller();

          Model.Hersteller hersteller = null;
          do
          {
            int herstellerId = (int)this.Manager.ZahlenEingabe("Geben Sie bitte die Id eins Herstellers ein:");
            hersteller = this.Manager.Fachkonzept.GibHersteller(herstellerId);

          } while (hersteller == null);

          Model.Auto[] autos = this.Manager.Fachkonzept.GibAutosNach(hersteller);

          Console.WriteLine("Auflistung aller Autos mit Hersteller-ID: " + hersteller.Id + " (" + hersteller.Name + "):");
          Console.WriteLine("--------------------------------------------");
          if (autos != null && autos.Length > 0)
          {
            foreach (Model.Auto h in autos)
            {
              this.ZeigeAuto(h);
            }
          }
          else
          {
            Console.WriteLine("Es wurden keine Autos gefunden.");
          }
        }

        private void ZeigeAuto(Model.Auto auto)
        {
            string modell = (auto.Modell != null) ? auto.Modell.Bezeichnung : "";
            string hersteller = (auto.Modell != null && auto.Modell.Hersteller != null) ? auto.Modell.Hersteller.Name : "";

            // TODO: Farbe anzeigen.

            Console.WriteLine("ID: " + auto.Id);
            Console.WriteLine("\tModell: " + modell);
            Console.WriteLine("\tHersteller: " + hersteller);
            Console.WriteLine("\tLeistung: " + auto.Leistung + " PS");
            Console.WriteLine("\tHubraum: " + auto.Hubraum + " ccm");
            Console.WriteLine("\tZylinder: " + auto.Zylinder);
            Console.WriteLine("\tKraftstoff: " + auto.Kraftstoff);
            Console.WriteLine("\tFarbe: " + System.Drawing.ColorTranslator.ToHtml(auto.Farbe));
            if (auto.Verbrauch != null)
            {
              Console.WriteLine("\tVerbrauch:");
              Console.WriteLine("\t\t- Innerorts: " + auto.Verbrauch.Innerorts.ToString("0.00") + " l/100km");
              Console.WriteLine("\t\t- Ausserorts: " + auto.Verbrauch.Ausserorts.ToString("0.00") + " l/100km");
              Console.WriteLine("\t\t- Kombiniert: " + auto.Verbrauch.Kombiniert.ToString("0.00") + " l/100km");
            }
            Console.WriteLine();
        }

        private void ZeigeHersteller()
        {
          Model.Hersteller[] hersteller = this.Manager.Fachkonzept.GibHersteller();

          Console.WriteLine("Auflistung aller Hersteller:");
          Console.WriteLine("--------------------------------------------");
          if (hersteller != null && hersteller.Length > 0)
          {
            foreach (Model.Hersteller h in hersteller)
            {
              Console.WriteLine("ID: " + h.Id + ", " + h.Name);
            }
          }
          else
          {
            Console.WriteLine("Es wurden keine Hersteller gefunden.");
          }
        }

        private void ZeigeModelle()
        {
          Model.Modell[] modelle = this.Manager.Fachkonzept.GibModelle();

          Console.WriteLine("Auflistung aller Modelle:");
          Console.WriteLine("--------------------------------------------");
          if (modelle != null && modelle.Length > 0)
          {
            foreach (Model.Modell m in modelle)
            {
              Console.WriteLine("ID: " + m.Id + ", " + m.Bezeichnung + ", Hersteller: " + ((m.Hersteller != null) ? m.Hersteller.Name : ""));
            }
          }
          else
          {
            Console.WriteLine("Es wurden keine Modelle gefunden.");
          }
        }

        private void AutoErstellenUndSpeichern(bool isEdit = false, int id = int.MinValue)
        {
            int leistung = (int)this.Manager.ZahlenEingabe("Leistung (PS):");
            int hubraum = (int)this.Manager.ZahlenEingabe("Hubraum (ccm):");
            int zylinder = (int)this.Manager.ZahlenEingabe("Zylinder:");
            int verbrauch_innerorts = (int)this.Manager.ZahlenEingabe("Verbrauch-Innerorts (l/100km):");
            int verbrauch_ausserorts = (int)this.Manager.ZahlenEingabe("Verbrauch-Ausserorts (l/100km):");
            string kraftstoff = this.Manager.EinfacheTextEingabe("Kraftstoff (z.B. Super):");
            string farbe = this.Manager.EinfacheTextEingabe("Farbe (z.B. #FF0000):");

            if (kraftstoff == "")
            {
                kraftstoff = null;
            }

            Model.Modell modell = null;
            do
            {
                string modellId = this.Manager.EinfacheTextEingabe("Geben Sie bitte die Id eins Modells ein. (Enter zum ueberspringen):");

                if (modellId == null || modellId == "")
                {
                     break;
                }

                decimal number;
                decimal.TryParse(modellId, out number);
                modell = this.Manager.Fachkonzept.GibModell((int)number);

            } while (modell == null);

            if (this.Manager.JaNeinFrage("Moechten Sie die Aenderungen Speichern?"))
            {
              System.Drawing.Color f = System.Drawing.Color.Black;
              try
              {
                f = System.Drawing.ColorTranslator.FromHtml(farbe);
              }
              catch { }

                var auto = new Model.Auto()
                {
                    Modell = modell,
                    Kraftstoff = kraftstoff,
                    Leistung = leistung,
                    Hubraum = hubraum,
                    Zylinder = zylinder,
                    Verbrauch = new Model.Verbrauch() { Innerorts = verbrauch_innerorts, Ausserorts = verbrauch_ausserorts },
                    Farbe = f
                };
                bool b;
                if (isEdit)
                {
                    b = this.Manager.Fachkonzept.BearbeiteAuto(id, auto);
                }
                else
                {
                    b = this.Manager.Fachkonzept.NeuesAuto(auto);
                }
                if (b)
                {
                    Console.WriteLine("Das Auto wurde erfolgreich gespeichert.");
                }
                else
                {
                    Console.WriteLine("Das Auto konnte nicht gespeichert werden.");
                }
            }
        }

        private void NeuesAuto()
        {
            Console.WriteLine("Neues Auto:\n");
            this.AutoErstellenUndSpeichern();
        }

        private void BearbeiteAuto()
        {
            this.ZeigeAutos();

            Model.Auto auto = null;
            do
            {
                int id = (int)this.Manager.ZahlenEingabe("Waehlen Sie das Auto aus, welches Sie bearbeiten moechen. ID:");
                auto = this.Manager.Fachkonzept.GibAuto(id);
            }
            while (auto == null);

            this.Manager.ConsoleLeeren();
            Console.WriteLine("Aktuelle Auto Daten:");
            this.ZeigeAuto(auto);

            Console.WriteLine("\nNeue Daten:");
            this.AutoErstellenUndSpeichern(true, auto.Id);
        }

        private void LoescheAuto()
        {
            this.ZeigeAutos();
            int id = (int)this.Manager.ZahlenEingabe("Waehlen Sie das zu loeschende Auto aus. ID:");
            if (this.Manager.JaNeinFrage("Moechten Sie das Auto mit der ID: " + id + " wirklich loeschen?"))
            {
                if (this.Manager.Fachkonzept.LoescheAuto(id))
                {
                    Console.WriteLine("Das Auto wurde erfolgreich geloescht.");
                }
                else
                {
                    Console.WriteLine("Das Auto konnte nicht gelöscht werden.");
                }
            }
        }
    }
}
